home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / games / blockscroller / block.scroll.s < prev    next >
Text File  |  1980-01-03  |  9KB  |  363 lines

  1.  
  2. ;-------------------------------------------------------------------------
  3. ; BLOCK-SCROLLER
  4. ;-------------------------------------------------------------------------
  5. ; Programmed by Lars Haugseth 9/12-92      - PAL only -
  6. ;-------------------------------------------------------------------------
  7. ; CONSTANTS
  8. ;-------------------------------------------------------------------------
  9.  
  10. EXECBASE    = 4
  11.  
  12. CUSTOMBASE    = $DFF000        ; Custom-chips register offset
  13.  
  14. OpenLibrary    = -408            ; Library function offsets
  15. CloseLibrary    = -414
  16. VBeamPos    = -384
  17.  
  18. SW        = 44            ; Width of screen in bytes
  19. SH        = 256            ; Height of screen in pixels
  20. MX        = 32            ; Maximum pages of scrolling
  21.  
  22. ;-------------------------------------------------------------------------
  23. ; MACROS
  24. ;-------------------------------------------------------------------------
  25.  
  26. WRAST:    MACRO                ; Wait for a specific rasterpos.
  27.     movem.l    d0-a6,-(SP)
  28.     move.l    GFXBASE,a6
  29. \@1    jsr    VBeamPos(a6)
  30.     cmp.w    #\1,d0
  31.     bne.s    \@1
  32.     movem.l    (SP)+,d0-a6
  33.     ENDM
  34.  
  35. WBLIT:    MACRO                ; Wait for the blitter to finish
  36.     btst    #6,$02(a5)
  37.     bne.s    \@1
  38.     bra.s    \@2
  39. \@1    nop
  40.     nop
  41.     btst    #6,$02(a5)
  42.     bne.s    \@1
  43. \@2
  44.     ENDM
  45.  
  46. ;-------------------------------------------------------------------------
  47. ; PROGRAM
  48. ;-------------------------------------------------------------------------
  49.  
  50.     SECTION    "code",code_c
  51.  
  52. STARTPROG:
  53.  
  54.     move.l    EXECBASE,a6        ; Open graphics.library
  55.     lea    GFXNAME,a1
  56.     moveq    #0,d0
  57.     jsr    OpenLibrary(a6)
  58.     move.l    d0,GFXBASE
  59.     beq    EXIT
  60.  
  61.     lea    CUSTOMBASE,a5
  62.     move.l    GFXBASE,a6
  63.  
  64.     move.l    $26(a6),OLDCOPPERLIST    ; Save copperlist
  65.     move.w    $1C(a5),OLDINTERRUPTS    ; Save enabled interrupts
  66.     move.w    $02(a5),OLDDMACONTROL    ; Save dmacontrol
  67.  
  68.     move.w    #$87E0,$96(a5)        ; Enable some DMAs
  69.     move.w    #$7FFF,$9A(a5)        ; Disable all interrupts
  70.  
  71. ;-------------------------------------------------------------------------
  72.  
  73. INITMAP:
  74.  
  75.     lea    SCROLLMAP,a0
  76.     moveq    #0,d7
  77. IMAP1:    cmp.w    #320,d7
  78.     blt.s    IMAP2
  79.     bsr    GETRANDOM
  80.     bra.s    IMAP3
  81. IMAP2:    move.w    d7,d0
  82. IMAP3:    move.w    d0,(a0)+
  83.     addq    #1,d7
  84.     cmp.w    #(SW*8)*MX,d7
  85.     bne.s    IMAP1
  86.  
  87. ;-------------------------------------------------------------------------
  88.  
  89. INITCOPPER:                ; Initialize copperlist
  90.  
  91.     lea    COLOURS,a0        ; Insert palette
  92.     lea    COP1PALETTE+2,a1
  93.     move.w    #31,d7
  94. ICOP1:    move.w    (a0)+,(a1)
  95.     addq.w    #4,a1
  96.     dbf    d7,ICOP1
  97.  
  98.     move.l    #BLANKS,d0        ; Insert blank sprites
  99.     move.w    d0,COP1SPRITES+06
  100.     move.w    d0,COP1SPRITES+14
  101.     move.w    d0,COP1SPRITES+22
  102.     move.w    d0,COP1SPRITES+30
  103.     move.w    d0,COP1SPRITES+38
  104.     move.w    d0,COP1SPRITES+46
  105.     move.w    d0,COP1SPRITES+54
  106.     move.w    d0,COP1SPRITES+62
  107.     swap    d0
  108.     move.w    d0,COP1SPRITES+02
  109.     move.w    d0,COP1SPRITES+10
  110.     move.w    d0,COP1SPRITES+18
  111.     move.w    d0,COP1SPRITES+26
  112.     move.w    d0,COP1SPRITES+34
  113.     move.w    d0,COP1SPRITES+42
  114.     move.w    d0,COP1SPRITES+50
  115.     move.w    d0,COP1SPRITES+58
  116.  
  117.     move.l    #SCROLLPLANES+(0*SW),d0    ; Insert Bitplane pointers
  118.     move.l    #SCROLLPLANES+(1*SW),d1
  119.     move.l    #SCROLLPLANES+(2*SW),d2
  120.     move.l    #SCROLLPLANES+(3*SW),d3
  121.     move.l    #SCROLLPLANES+(4*SW),d4
  122.     add.l    d5,d0
  123.     add.l    d5,d1
  124.     add.l    d5,d2
  125.     add.l    d5,d3
  126.     add.l    d5,d4
  127.     move.w    d0,COP1PLANE1+6
  128.     move.w    d1,COP1PLANE2+6
  129.     move.w    d2,COP1PLANE3+6
  130.     move.w    d3,COP1PLANE4+6
  131.     move.w    d4,COP1PLANE5+6
  132.     swap    d0
  133.     swap    d1
  134.     swap    d2
  135.     swap    d3
  136.     swap    d4
  137.     move.w    d0,COP1PLANE1+2
  138.     move.w    d1,COP1PLANE2+2
  139.     move.w    d2,COP1PLANE3+2
  140.     move.w    d3,COP1PLANE4+2
  141.     move.w    d4,COP1PLANE5+2
  142.  
  143.     move.l    #COPPERLIST,$80(a5)    ; Start copperlist
  144.     clr.w    $88(a5)
  145.  
  146. ;-------------------------------------------------------------------------
  147.  
  148. MAINLOOP:
  149.  
  150.     WRAST    $110            ; Wait for rasterpos $111
  151.     WRAST    $111
  152.  
  153.     move.w    #$722,$180(a5)        ; Scroll screen, and set
  154.     bsr    SCROLLER        ; a red background colour
  155.     move.w    #$000,$180(a5)        ; to measure time
  156.  
  157.     btst    #6,$BFE001        ; Loop until LMB is pressed
  158.     bne.s    MAINLOOP
  159.  
  160. ;-------------------------------------------------------------------------
  161.  
  162. EXITPROGRAM:
  163.  
  164.     move.l    EXECBASE,a6        ; Close graphics.library
  165.     move.l    GFXBASE,a1
  166.     jsr    CloseLibrary(a6)
  167.  
  168. EXIT:    lea    CUSTOMBASE,a5        ; Restore old values and exit
  169.     or.w    #$8000,OLDDMACONTROL
  170.     or.w    #$8000,OLDINTERRUPTS
  171.     move.w    OLDDMACONTROL,$96(a5)
  172.     move.w    OLDINTERRUPTS,$9A(a5)
  173.     move.l    OLDCOPPERLIST,$80(a5)
  174.     clr.w    $88(a5)
  175.     moveq    #0,d0
  176.     rts
  177.  
  178. ;-------------------------------------------------------------------------
  179.  
  180. GETRANDOM:
  181.  
  182.     moveq    #0,d0            ; Get a 'random' byte
  183.     moveq    #0,d1
  184.     move.b    $DFF007,d0
  185.     move.b    $BFD800,d1
  186.     eor.b    d1,d0
  187.     rts
  188.  
  189. ;-------------------------------------------------------------------------
  190.  
  191. SCROLLER:                ; Scrolling routine
  192.  
  193.     btst    #2,$DFF016        ; Skip if RMB is pressed
  194.     beq.w    SCRLX
  195.  
  196.     move.w    SCROLLPOS,d1        ; Lowest 4 bits into BPLCON1
  197.     and.w    #15,d1
  198.     sub.w    #15,d1
  199.     neg    d1
  200.     mulu    #$11,d1
  201.     move.w    d1,COP1SCROLL+2
  202.  
  203.     move.w    SCROLLPOS,d5        ; Add words to Bitplane-pointers
  204.     lsr.w    #4,d5
  205.     add.w    d5,d5
  206.     and.l    #$FFFE,d5
  207.  
  208.     move.l    #SCROLLPLANES+(0*SW),d0    ; Update pointers in
  209.     move.l    #SCROLLPLANES+(1*SW),d1    ; copperlist
  210.     move.l    #SCROLLPLANES+(2*SW),d2
  211.     move.l    #SCROLLPLANES+(3*SW),d3
  212.     move.l    #SCROLLPLANES+(4*SW),d4
  213.     add.l    d5,d0
  214.     add.l    d5,d1
  215.     add.l    d5,d2
  216.     add.l    d5,d3
  217.     add.l    d5,d4
  218.     move.l    d0,COPYADR        ; Store address where new
  219.     add.l    #SW-2,COPYADR        ; blocks are to copied
  220.     move.w    d0,COP1PLANE1+6
  221.     move.w    d1,COP1PLANE2+6
  222.     move.w    d2,COP1PLANE3+6
  223.     move.w    d3,COP1PLANE4+6
  224.     move.w    d4,COP1PLANE5+6
  225.     swap    d0
  226.     swap    d1
  227.     swap    d2
  228.     swap    d3
  229.     swap    d4
  230.     move.w    d0,COP1PLANE1+2
  231.     move.w    d1,COP1PLANE2+2
  232.     move.w    d2,COP1PLANE3+2
  233.     move.w    d3,COP1PLANE4+2
  234.     move.w    d4,COP1PLANE5+2
  235.  
  236.     bsr    COPYBLOCK            ; Copy a block at right edge
  237.  
  238.     cmp.w    #8*SW*(MX-1),SCROLLPOS        ; Scroll 1 pixel left
  239.     bge.s    SCRLX
  240.     addq.w    #1,SCROLLPOS
  241.  
  242. SCRLX:    rts
  243.  
  244. ;-------------------------------------------------------------------------
  245.  
  246. COPYBLOCK:                    ; Copy a block onto screen
  247.  
  248.     lea    SCROLLMAP,a0            ; Get block number from
  249.     add.w    SCROLLPOS,a0            ; the map
  250.     add.w    SCROLLPOS,a0
  251.     move.w    (a0),d0
  252.  
  253.     lea    BLOCKS,a0            ; Calculate address for
  254.     mulu    #160,d0                ; the block data
  255.     add.l    d0,a0
  256.  
  257.     move.w    SCROLLPOS,d1            ; Calculate address that
  258.     and.l    #15,d1                ; the block is copied into
  259.     mulu    #5*16*SW,d1
  260.     move.l    COPYADR,a1
  261.     add.l    d1,a1
  262.  
  263.     lea    CUSTOMBASE,a5            ; Blit block onto screen
  264.     WBLIT
  265.     move.l    a0,$50(a5)            ; BLTAPTR
  266.     move.l    a1,$54(a5)            ; BLTDPTR
  267.     move.l    #$0000002A,$64(a5)        ; BLTAMOD BLTDMOD
  268.     move.l    #$09F00000,$40(a5)        ; BLTCON0 BLTCON1
  269.     move.l    #$FFFFFFFF,$44(a5)        ; BLTAFWM BLTALWM
  270.     move.w    #$1401,$58(a5)            ; BLTSIZE
  271.     WBLIT
  272.     rts
  273.  
  274. ;-------------------------------------------------------------------------
  275. ; PUBLICMEM STORAGE
  276. ;-------------------------------------------------------------------------
  277.  
  278.         SECTION "publicdata",data_c
  279.  
  280. OLDCOPPERLIST:    dc.l    0
  281. OLDINTERRUPTS:    dc.l    0
  282. OLDDMACONTROL:    dc.l    0
  283.  
  284. SCROLLPOS:    dc.w    0        ; Scrollposition in pixels
  285.  
  286. COPYADR:    dc.l    0        ; Where to copy new blocks on screen
  287.  
  288. COLOURS:    dc.w    $000,$FFF,$EEE,$DDD,$CCC,$BBC,$AAB,$99A    ; Palette
  289.         dc.w    $889,$777,$666,$555,$444,$333,$222,$111
  290.         dc.w    $F87,$E65,$C43,$911,$800,$600,$400,$300
  291.         dc.w    $500,$B98,$DB9,$FDC,$846,$956,$A67,$A79
  292.  
  293. SCROLLMAP:    dcb.w    (SW*8)*MX,0    ; Block map
  294.  
  295. GFXBASE:    dc.l    0
  296. GFXNAME:    dc.b    "graphics.library",0
  297.  
  298. ;-------------------------------------------------------------------------
  299. ; COPPERLIST
  300. ;-------------------------------------------------------------------------
  301.  
  302.         SECTION "chipdata",data_c
  303.  
  304. COPPERLIST:    dc.w    $008E,$2C81,$0090,$2CC1    ; DisplayWindow
  305.         dc.w    $0092,$0030,$0094,$00D0    ; DataFetch
  306.         dc.w    $0108,$00B2,$010A,$00B2    ; BitplaneModulo
  307.         dc.w    $0102,$0000,$0104,$0000    ; BPLCON1 & BPLCON2
  308.  
  309. COP1SPRITES:    dc.w    $0120,$0000,$0122,$0000    ; Sprite pointers
  310.         dc.w    $0124,$0000,$0126,$0000
  311.         dc.w    $0128,$0000,$012A,$0000
  312.         dc.w    $012C,$0000,$012E,$0000
  313.         dc.w    $0130,$0000,$0132,$0000
  314.         dc.w    $0134,$0000,$0136,$0000
  315.         dc.w    $0138,$0000,$013A,$0000
  316.         dc.w    $013C,$0000,$013E,$0000
  317.  
  318. COP1PALETTE:    dc.w    $0180,$0000,$0182,$0000    ; Palette
  319.         dc.w    $0184,$0000,$0186,$0000
  320.         dc.w    $0188,$0000,$018A,$0000
  321.         dc.w    $018C,$0000,$018E,$0000
  322.         dc.w    $0190,$0000,$0192,$0000
  323.         dc.w    $0194,$0000,$0196,$0000
  324.         dc.w    $0198,$0000,$019A,$0000
  325.         dc.w    $019C,$0000,$019E,$0000
  326.         dc.w    $01A0,$0000,$01A2,$0000
  327.         dc.w    $01A4,$0000,$01A6,$0000
  328.         dc.w    $01A8,$0000,$01AA,$0000
  329.         dc.w    $01AC,$0000,$01AE,$0000
  330.         dc.w    $01B0,$0000,$01B2,$0000
  331.         dc.w    $01B4,$0000,$01B6,$0000
  332.         dc.w    $01B8,$0000,$01BA,$0000
  333.         dc.w    $01BC,$0000,$01BE,$0000
  334.  
  335. COP1PLANE1:    dc.w    $00E0,$0000,$00E2,$0000    ; Bitplane pointers
  336. COP1PLANE2:    dc.w    $00E4,$0000,$00E6,$0000
  337. COP1PLANE3:    dc.w    $00E8,$0000,$00EA,$0000
  338. COP1PLANE4:    dc.w    $00EC,$0000,$00EE,$0000
  339. COP1PLANE5:    dc.w    $00F0,$0000,$00F2,$0000
  340.  
  341. COP1SCROLL:    dc.w    $0102,$0000        ; FineScrolling BPLCON1
  342.  
  343.         dc.w    $2C07,$FFFE,$0100,$5200    ; Turn on bitplanes at line $2C
  344.  
  345.         dc.w    $FFDF,$FFFE        ; Wait below line $100
  346.  
  347.         dc.w    $2C07,$FFFE,$0100,$0000    ; Turn off bitplanes at $12C
  348.  
  349.         dc.w    $FFFF,$FFFE        ; End copperlist
  350.  
  351. ;-------------------------------------------------------------------------
  352. ; CHIPMEM STORAGE
  353. ;-------------------------------------------------------------------------
  354.  
  355. SCROLLPLANES:    dcb.b    5*SW*(SH+MX),0        ; Scroll bitplanes
  356.  
  357.         incdir "source.s:"        ; Where to load includes
  358. BLOCKS:        incbin "blocks.scroll.raw"    ; Block image data
  359.  
  360. BLANKS:        dc.l    0,0            ; Blank sprite
  361.  
  362. ;-------------------------------------------------------------------------
  363.